home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / OUTS.SA < prev    next >
Text File  |  1987-03-04  |  22KB  |  998 lines

  1.   NAM  OUTS
  2.  TTL  BINARY TO DECIMAL STRING CONVERSION
  3. *
  4. * LINKING LOADER DEFINITIONS
  5. *
  6.  XREF FPMOVE,PWRTEN,FFIX,FMUL,FDIV,FADD,FSUB,MAGCMP
  7.  XREF LOG10X,DNORM1,ONE,CLRES,ROUND,DENORM,TFRACT
  8.  XREF ARG1UN,LNORM,IOPSUB,IOPSET,GETINT
  9. *
  10.  XDEF BDCNVT,OUTNDC,BCDINC,BCDUBL,BINSTR
  11. *
  12. * REVISION HISTORY:
  13. *
  14. *   DATE    PROGRAMMER     REASON
  15. *
  16. *  28.MAY.80    G. STEVENS &   ORIGINAL
  17. *        G. WALKER
  18. *  12.JUN.80    G. STEVENS     FIX NEGD IN BINDEC &
  19. *                   V AS ARGUMENT TO SPCASE
  20. *  16.JUN.80    G. STEVENS     RESTORE V AFTER RTS FROM SPCASE
  21. *  17.JUL.80    G. WALKER      CODE SHRINK (XREF ONE, ETC.)
  22. *  18.JUL.80    G. STEVENS     ADD NON DECIMAL PROCEDURE OUTNDC
  23. *  05.AUG.80    G. STEVENS     ADD CODE TO HANDLE P ON OUTS
  24. *  13.AUG.80    G. WALKER      SAVE BYTES BY USING 'ROUND' IN
  25. *                  BINSTR
  26. *  21.AUG.80    G. STEVENS     REWORK LOG10X PART OF OUTS
  27. *  26.AUG.80    G. STEVENS     CLEAR INX FLAG IN BDCNVT AND
  28. *                   INVOKE ARG1UN IN SPCASE
  29. *  27.AUG.80    J. BONEY       ADD CODE TO VALIDATE K
  30. *  28.OCT.80    G. STEVENS     FIX STACK OFFSET IN BDCNVT
  31. *  03.DEC.80    G. STEVENS     REMOVE LNORM CALL IN OUTS
  32. *  03.DEC.80    G. STEVENS     INT PART OF PRELIM MANTISSA
  33. *  14.DEC.80    G.WALKER       REMOVE CALL TO ROUND FROM BINSTR
  34. *
  35.   PAGE
  36. *
  37. ****************************************************
  38. *
  39. *    BCDUBL --
  40. *    MULTIPLIES A BCD INTEGER BY 2 AND RETURNS ANY CARRY
  41. *    OUT OF THE MOST SIGNIFICANT DIGIT IN THE CARRY FLAG.
  42. *
  43. *    ON ENTRY:
  44. *     B = NUMBER OF DIGITS (PLUS SIGN) IN BCD NUMBER
  45. *     X = POINTER TO BCD NUMBER
  46. *
  47. *    ON EXIT:
  48. *     C FLAG = CARRY OUT OF MOST SIGNIFICANT DIGIT
  49. *     D,X,Y,U,S ARE UNCHANGED.
  50. *
  51. *     OPERATION:
  52. *     OBVIOUS.
  53. *
  54. *    LOCAL STORAGE:
  55. *     NONE.
  56. *
  57. BCDUBL EQU *
  58.   PSHS    D
  59.   DECB            CHANGE BYTE COUNT TO INDEX
  60.   CLRA            INITIAL CARRY = 0
  61.   WHILE  B,GE,#1    LOOP FOR EACH BCD DIGIT
  62.     RORA        SET CARRY FROM PRECEDING DIGIT
  63.     LDA  B,X
  64.     ROLA        MULTIPLY DIGIT BY 2 AND INSERT
  65. *               CARRY
  66.     BSR  ADJUST      ADJUST FOR DECIMAL DIGIT
  67.     DECB        NEXT DIGIT
  68.   ENDWH
  69.   RORA            PUT HIGH ORDER CARRY INTO CC-REG
  70. *
  71.   PULS    D,PC
  72.   TTL  INCREMENT BCD NUMBER BY ONE
  73.   PAGE
  74. ***********************************************
  75. *
  76. *    BCDINC --
  77. *     ADDS 1 TO A BCD INTEGER AND RETURNS THE
  78. *    CARRY OUT OF THE MOST SIGNIFICANT DIGIT IN THE
  79. *    CC-REG.
  80. *
  81. *    ON ENTRY:
  82. *     B = NUMBER OF BYTES IN BCD NUMBER (PLUS SIGN)
  83. *     X = POINTER TO BCD NUMBER
  84. *
  85. *    ON EXIT:
  86. *     CC = CARRY OUT OF MOST SIGNIFICANT DIGIT
  87. *     D,X,Y,U,S ARE UNCHANGED.
  88. *
  89. *    OPERATION:
  90. *     OBVIOUS.
  91. *
  92. *    LOCAL STORAGE:
  93. *     NONE.
  94. *
  95. BCDINC EQU *
  96.   PSHS    D
  97.   DECB            CHANGE BYTE COUNT TO INDEX
  98.   LDA  #1        SET INITIAL CARRY IN
  99.   WHILE A,GE,#1
  100.     IF B,LE,#0
  101.       BRA BINCXT    QUIT IF NO MORE CARRY
  102.     ENDIF
  103.     ADDA B,X        ADD CARRY INTO DIGIT
  104.     BSR  ADJUST      ADJUST FOR DECIMAL DIGIT
  105.     DECB        NEXT MOST SIGNIFICANT DIGIT
  106.   ENDWH
  107. *
  108. BINCXT EQU *
  109.   RORA            PUT CARRY INTO CC-REGISTER
  110.   PULS    D,PC
  111. *
  112. *****************************************************
  113. *
  114. *    ADJUST --
  115. *     THIS ROUTINE ADJUSTS THE UNSIGNED INTEGER IN
  116. *    'A' TO LIE IN THE RANGE 0-9, AND STORES THE
  117. *    RESULTING DECIMAL DIGIT INTO THE BCD STRING
  118. *    POINTED TO BY X AND INDEXED BY B.
  119. *    THE CARRY OUT OF THIS DIGIT IS RETURNED IN 'A'.
  120. *
  121. *    ON ENTRY:
  122. *    A = DIGIT TO BE ADJUSTED
  123. *    B = INDEX INTO BCD STRING
  124. *    X = POINTER TO BCD STRING
  125. *
  126. *    ON EXIT:
  127. *    A = CARRY OUT OF DIGIT
  128. *    CC BASHED.
  129. *    X,Y,U,S UNCHANGED.
  130. *
  131. *    LOCAL STORAGE:
  132. *    NONE.
  133. *
  134. ADJUST EQU *
  135.     IF    A,GE,#10
  136.       SUBA #10
  137.       STA  B,X        ADJUST DIGIT FOR 0<=D<=9
  138.       LDA  #1          AND SHOW CARRY OUT
  139.     ELSE
  140.       STA  B,X        DIGIT IS OK
  141.       CLRA          AND NO CARRY OUT
  142.     ENDIF
  143.     RTS
  144. *
  145.   TTL  BINARY FP INTEGER TO BCD INTEGER CONVERSION
  146.   PAGE
  147. ****************************************************
  148. *
  149. *    BINSTR --
  150. *     CONVERTS THE INTEGER PART OF A BINARY FLOATING-
  151. *    POINT NUMBER INTO A STRING OF BCD DIGITS.
  152. *    IT IS ASSUMED THAT 'RPREC' IS SET TO 'EXTENDED PRECISION'
  153. *    BEFORE BINSTR IS CALLED.
  154. *
  155. *    ON ENTRY:
  156. *     B = COUNT OF DIGITS (PLUS SIGN) IN BCD ARRAY
  157. *     X = POINTER TO BCD ARRAY
  158. *     Y = POINTER TO INTERNAL FORMAT FP NUMBER
  159. *
  160. *    ON EXIT:
  161. *     CC,A,B ARE DESTROYED.
  162. *     X,Y,U,S ARE UNCHANGED.
  163. *
  164. *    OPERATION:
  165. *     THE BINARY FP NUMBER IS DENORMALIZED TO PRODUCE A
  166. *    64-BIT BINARY INTEGER IN THE MANTISSA.  THIS BINARY
  167. *    INTEGER IS THEN CONVERTED TO A BCD INTEGER USING METHOD
  168. *    '1B' ON PAGE 281 OF KNUTH, D.E. THE ART OF COMPUTER
  169. *    PROGRAMMING. VOL. 2. SEMINUMERICAL ALGORITHMS. (READING,
  170. *    MASS.: ADDISON-WESLEY), 1973.  THIS IS DONE BY MULTIPLYING
  171. *    THE BCD INTEGER BY 2 FOR EACH ITERATION OF THE LOOP
  172. *    AND ADDING ONE IF THE CORRESPONDING BIT OF THE BINARY
  173. *    INTEGER IS ONE.
  174. *     THE BCD INTEGER CANNOT OVERFLOW, BECAUSE IT REPRESENTS
  175. *    AT MOST 17 DECIMAL DIGITS, WHICH CAN BE REPRESENTED IN
  176. *    60 BINARY BITS.
  177. *
  178. *    SUBROUTINES CALLED:
  179. *     BCDUBL -- MULTIPLIES A BCD INTEGER BY 2
  180. *     BCDINC -- INCREMENTS A BCD INTEGER BY 1
  181. *
  182. *    LOCAL STORAGE:
  183. *     BCDSIZ -- COUNT OF DIGITS (PLUS SIGN) IN BCD INT.
  184. *     LOPCTR -- COUNT FOR DENORMALIZING LOOP
  185. *     LOCSTK -- LOCAL STICKY BYTE FOR ROUNDING
  186. *     BITNDX -- INDEX OF BINARY BIT FOR ACCUMULATING
  187. *     BITMSK -- MASK FOR BIT BEING ACCUMULATED
  188. *     CTLSAV -- SAVE OLD CONTROL BYTE FROM FPCB
  189. *     TMPX    -- TEMP. SAVE X-REG
  190. *
  191. BCDSIZ SET 0
  192. LOPCTR SET 1
  193. LOCSTK SET 2
  194. BITNDX SET 3
  195. BITMSK SET 4
  196. CTLSAV SET 5
  197. TMPX   SET 6
  198. *
  199. BINSTR EQU *
  200.   LEAS -8,S           RESERVE LOCAL STORAGE
  201.   STB  BCDSIZ,S        SAVE BCD INTEGER SIZE
  202.   LDA  SIGN,Y
  203.   IFCC LT
  204.     LDA  #DMINUS
  205.   ENDIF
  206.   STA  0,X           MOVE FP SIGN TO BCD
  207. *
  208. *    ZERO OUT BCD INTEGER
  209. *
  210.   LDA  #0
  211.   LDB  BCDSIZ,S
  212.   DECB
  213.   WHILE  B,GE,#1
  214.     STA  B,X
  215.     DECB
  216.   ENDWH
  217. *
  218. *     DENORMALIZE FP NUMBER UNTIL IT HAS 71 BITS OF INTEGER
  219. *    AND 1 BIT OF FRACTION IN THE MANTISSA.
  220. *
  221.   LDD  EXP,Y
  222.   CMPD    #-1            IF THERE ARE NO INTEGER BITS,
  223.   BLT  BINZER              SET RESULT TO ZERO
  224.   STX  TMPX,S            SAVE POINTER TO BCD BUFFER
  225.   LEAX 0,Y            POINT X TO FP NUMBER
  226.   CLR  STIKY,U
  227.   SUBD #63            CHANGE EXPONENT TO SHIFT COUNT
  228.   COMA                   MUST COMPLEMENT THE DIFFERENCE
  229.   COMB
  230.   ADDD    #1
  231.   LBSR    DENORM             DENORMALIZE FRACTION TO EXTENDED BOUNDARY
  232.   LEAY    FRACT,X          GET FRACT OF OLD Y-REG
  233.   LDX  TMPX,S            AND OLD X-REG
  234. *
  235. *     LOOP TO ACCUMULATE THE 72 BINARY INTEGER BITS INTO THE
  236. *    BCD INTEGER.
  237. *
  238.   LDA  #0
  239.   LDB  A,Y
  240.   WHILE  B,EQ,#0
  241.     CMPA  #TYPE-FRACT-2       STOP AT EXTENDED BYTE BOUNDARY
  242.     BGT   BNSNLP          END IF ALL ARE ZERO
  243.     INCA             SKIP OVER ZERO BYTES OF MANTISSA
  244.     LDB  A,Y
  245.   ENDWH
  246. BNSNLP    EQU  *
  247.   LDB  #$80
  248.   STB  BITMSK,S          START ACCUMULATING BIT7
  249. *
  250. *     NOW ACCUMULATE THE NON-ZERO BITS INTO BCD.
  251. *       ('A' CONTAINS INDEX OF NON-ZERO BYTE.)
  252. *
  253.   WHILE  A,LE,#TYPE-FRACT-2
  254.     LDB  BCDSIZ,S
  255.     LBSR BCDUBL          MULTIPLY BCD BY TWO FOR THIS BIT
  256.     LDB  A,Y
  257.     ANDB BITMSK,S
  258.     IFTST  B,NE,#0
  259.       LDB  BCDSIZ,S         THE BIT IS ONE, SO ADD IT IN
  260.       LBSR BCDINC
  261.     ENDIF
  262.     ROR  BITMSK,S         MOVE TO NEXT BIT
  263.     IFCC CS
  264.       ROR  BITMSK,S         IF NEEDED, MOVE TO NEXT BYTE
  265.       INCA
  266.     ENDIF
  267.   ENDWH
  268. *
  269. *     AND RETURN.
  270. *
  271.   LEAY    -FRACT,Y
  272. BINZER LEAS  8,S
  273.   RTS
  274. *
  275. *
  276. *
  277. *
  278. * PROCEDURE BDCNVT
  279. *
  280. *    BINDEC CONVERTS THE FLOATING- PT. NUMBER
  281. * IN ARG2 TO A DECIMAL FORMAT AND STORES THE BCD
  282. * REPRESENTATION AT THE ADDRESS CONTAINED IN THE
  283. * FIRST 2 BYTES OF THE RESULTS FRECACTION.
  284. *
  285. * ON ENTRY:
  286. *     U - STACK FRAME POINTER
  287. *     S - STACK PIINOINTER
  288. *
  289. * ON EXIT:
  290. *     U,S - UNCHANGED
  291. *     CC,D,X,Y - ARE DESTROYED
  292. *
  293. * LOCAL EQUATES
  294. *
  295. DPLUS EQU  00
  296. DMINUS EQU  $0F
  297. PINF EQU  $0A
  298. NINF EQU  $0B
  299. SNAN EQU  $0C
  300. STRSIZ EQU  26
  301. *
  302. * TEMPORARY STORAGE ON STACK
  303. *
  304. BCDADR EQU  0
  305. NORM   EQU  BCDADR+2
  306. SGNAR  EQU  NORM+1
  307. CTLBYT EQU  SGNAR+1
  308. FCN    EQU  CTLBYT+1
  309. PINDEX EQU  FCN+1
  310. RECNT  EQU PINDEX+1
  311. TV     EQU  RECNT+1
  312. TEMP EQU  0
  313. *
  314. *
  315. BDCNVT EQU  *
  316. *
  317. * CREATE SPACE FOR LOCEAL STORAGE ON THE S STACK
  318. *
  319.  LEAS  -(TV+2),S
  320. *
  321. * SAVE ADDSRESS OF THE USERS BCD ARRAY PRESENTLY
  322. * LOCATED IN FRACTR.
  323. *
  324.  LDX  FRACTR,U              ADDRESS OF BCD STRING
  325.  STX  BCDADR,S
  326. *
  327. * REMEMBER SIGN OF ARG2 AND WHETHER OR NOT ARG2
  328. * IS NORMALIZED
  329. *
  330.  LEAX  ARG2,U
  331.  LDA  FRACT,X              NORMALIZED INFO.
  332.  LDB  SIGN,X              SIGN OT ARGUMENT
  333.  STD  NORM,S              TEMP LOCATION ON STACK
  334. *
  335. * TAKE ABSOLUTE VALUE OF THE INPUT; P := |ARG2|
  336. *
  337.  CLR  SIGN,X
  338. *
  339. * CHECK FOR UNORMALIZED ZEROS AND RETURN A
  340. * PROPERLY SIGNED STRING OF ZEROS.
  341. *
  342.  LBSR  TFRACT              TEST FRACTION
  343.  IFCC  EQ              UNNORMAL ZERO
  344.    LDA    #TYZERO           TAG ARG2 AS A ZERO
  345.    STA    TYPE2,U
  346.    LBSR  OUTNDC           OUTPUT STRING OF ZEROS
  347. *
  348.    LBRA  EXOUTS           EXIT OUTS PROCEDURE
  349. *
  350.  ENDIF
  351. *
  352. *  SAVE P ON THE STACK
  353. *
  354.  LEAS  -ARGSIZ,S           CREATE SPACE
  355.  LEAY  0,S              DESTINATION
  356. *
  357.  LBSR  FPMOVE              MOVE A FLOATING NO.
  358. *
  359. * CHECK PRECISION AND TYPE TO DECIDE IF TO CONTINUE
  360. * WITH PRESENT ALGORITHM AND IF SO HOW TO ASSESS
  361. * THE LOG10(X) OF THE INPUT ARGUMENT.
  362. *
  363.  LDB  RPREC,U              CHECK PRECISION
  364.  IF  B,GE,#EXT               EXTENDED PRECISION
  365.    LBSR  LOG10X           LOG10X AS USUAL
  366. *
  367.  ELSE                  SINGLE OR DOUBLE
  368.    LDA    ARGSIZ+NORM,S
  369.    IFCC  LT              NORMALIZED
  370.      LBSR  LOG10X          LOG10X AS USUAL
  371. *
  372.    ELSE               NOT NORMALIZED
  373.      IF  B,EQ,#SIN          SINGLE
  374.        LEAX  SSMLOG,PCR       LOG10( SMALLEST NORM # SIN )
  375. *
  376.      ELSE              DOUBLE
  377.        LEAX  DSMLOG,PCR       LOG10( SMALLEST NORM # DBL )
  378. *
  379.      ENDIF
  380.      LEAY  ARG2,U
  381.      LBSR  FPMOVE          MOVE LOG10X TO THE RESULT
  382. *
  383.    ENDIF              NORMALIZED
  384.  ENDIF                  EXTENDED
  385. *
  386. ** REMEMBER CURRENT ROUNDING MODE, FUNCTION CODE
  387. * AND RPREC PRECISION INDEX.
  388. *
  389.  LDA  [PFPCB,U]           CONTROL BYTE
  390.  LDB  FUNCT,U              FUNCTION CODE
  391.  STD  ARGSIZ+CTLBYT,S          SAVE ON STACK
  392. *
  393.  LDB  RPREC,U              PRECISION INDEX
  394.  STB  ARGSIZ+PINDEX,S         SAVE ON STACK
  395. *
  396. * SET RND MODE TO RZ AND RPREC TO EXT. AND
  397. * FUNCTION CODE TO FCFIXS
  398. *
  399.  ANDA #$FF-(CTLRND+CTLSIZ)    REMOVE RND MODE AND PREC.
  400.  ORA  #RZ+PREXT           SET RZ AND EXT.
  401.  STA  [PFPCB,U]           REPLACE CONTROL BYTE
  402. *
  403.  LDA  #EXT
  404.  STA  RPREC,U              REPLACE PRECISION INDEX
  405. *
  406.  LDA  #FCFIXS
  407.  STA  FUNCT,U              REPLACE FUNCTION INDEX
  408. *
  409. * CONVERT THE LOG10(P) TO A  BINARY INTEGER
  410. *
  411.  LBSR  FFIX              FLOATING TO INTEGER CONVERSION
  412. *
  413. * COMPUTE V := IFIX(Q)+1-K
  414. *
  415.  CLR  TPARAM,U              K IN TPARAM+1
  416. * VALIDATE K
  417.  LDD TPARAM,U
  418.  IF D,GT,#MAXK
  419.    LDA #7         INVALID OPERATION=7
  420.    LBSR IOPSET
  421.    LDD #MAXK              SET K TO MAX AND CONTINUE
  422.    STD TPARAM,U
  423.  ENDIF
  424.  LDD FRACTR,U              RESULT OF FFIX(Q)
  425.  ADDD  #1
  426.  SUBD  TPARAM,U
  427.  STD  ARGSIZ+TV,S           SAVE V ON STACK
  428. *
  429. * START OF ADJUSTMENT LOOP FOR W
  430. *
  431. * INITIALIZE COUNTER FOR NO. OF PASSES THROUGH LOOP
  432. *
  433.  CLR  ARGSIZ+RECNT,S
  434. *
  435. GETW EQU  *
  436. *
  437. *
  438. * SET RND MOCE TO NEAREST
  439. *
  440.  LDA  ARGSIZ+CTLBYT,S          ORIGINAL CONTROL BYTE
  441.  ANDA #$FF-(CTLRND+CTLSIZ)    REMOVE ROUND INFO.
  442.  ORA  #RN+PREXT           INSERT NEW INFO.
  443.  STA  [PFPCB,U]           REPLACE CONTROL BYTE
  444. *
  445. * IF V IS NEGATIVE  NEGATE V
  446. *
  447.  LDD  ARGSIZ+TV,S          GET V
  448.  IFCC  LT              V IS NEGATIVE
  449.    COMA
  450.    COMB
  451.    ADDD  #1
  452. *
  453.  ENDIF
  454. *
  455. * COMPUTE  10|V
  456. *
  457.  LBSR  PWRTEN
  458. *
  459. * MOVE 10|V TO ARG2 AND P TO ARG1; CHECK THE SIGN
  460. * OF V, IF V IS POSITIVE COMPUTE W := P/10|V
  461. * ELSE IF V IS NEGATIVE COMPUTE W:= P*10|V.
  462. *
  463.  LEAX  RESULT,U           SOURCE
  464.  LEAY  ARG2,U              DESTINATION
  465. *
  466.  LBSR  FPMOVE              MOVE 10|V TP ARG2
  467. *
  468.  LEAX  TEMP,S              SOURCE
  469.  LEAY  ARG1,U              DESTINATION
  470. *
  471.  LBSR  FPMOVE              MOVE P TO ARG1
  472. *
  473. * ZERO OUT STACK FRAME RESULT
  474. *
  475.  LEAX  RESULT,U
  476.  LDB  #CLRALL              CLEAR ALL OF ARGUMENT
  477.  LBSR  CLRES
  478. *
  479. * CHECK SIGN OF V
  480. *
  481.  LDA  ARGSIZ+TV,S          SIGN OF V
  482.  IFCC  GE              SIGN POSITIVE
  483.    LBSR  FDIV              FLOATING DIVIDE
  484. *
  485.  ELSE                  SIGN NEGATIVE
  486.    LBSR  FMUL              FLOATING MULTIPLY
  487. *
  488.  ENDIF
  489. *
  490. * RESORE ORIGINAL ROUND MODE
  491. *
  492.  LDA  ARGSIZ+CTLBYT,S          ORIGINAL CONTROL BYTE
  493.  STA  [PFPCB,U]           RESTORE CONTROL BYTE
  494. *
  495. * RESTORE ORIGINAL SIGN AND TAKE THE INTEGER PART
  496. *
  497.  LEAX  RESULT,U           PRELIMINARY MANTISSA
  498.  LEAY  ARG2,U              INPUT TO INT PART
  499.  LBSR  FPMOVE              MOVE MANTISSA TO ARG2
  500. *
  501.  LDA  ARGSIZ+SGNAR,S          ORIGINAL SIGN
  502.  STA  SIGN,Y
  503. *
  504.  LBSR  GETINT              TAKE INTEGER PART
  505. *
  506.  CLR  SIGNR,U              CLEAR SIGN
  507. *
  508. * CHECK SPECIAL CASES
  509. *
  510.  LDA  ARGSIZ+NORM,S          PUT NORM INFO IN TYPE BYTE
  511.  STA  TYPER,U
  512. *
  513.  LDD  ARGSIZ+TV,S          V IS ARGUMENT TO CHEKW
  514. *
  515.  BSR  CHEKW            SPECIAL CASE CHECKER/HANDLER
  516. *
  517. * REPLACE V WITH POSSIBLY UPDATED VALUE
  518. *
  519.  STD  ARGSIZ+TV,S
  520. *
  521. * IF THE CARRY IS SET AND IF THE VALUE WAS ORIGINALLY
  522. * NORMALIZED AND HAS NOT GONE THROUGH THE ADJUSTMENT
  523. * PROCEDURE THEN RECALCULATE W.
  524. *
  525.  IFCC  CS              W FAILS CHECK W PROCEDURE
  526.    INC    ARGSIZ+RECNT,S          KEEP COUNT OF # OF TIMES FAILED
  527.    LDA    ARGSIZ+NORM,S          CHECK NORMALIZATION OF ARG2
  528.    IFCC  LT              ARG2 NORMALIZED
  529.      LDA  ARGSIZ+RECNT,S      CHECK COUNT
  530.      IF  A,LE,#01          FIRST PASS
  531.        BRA  GETW          RECALCULATE W
  532. *
  533.      ENDIF
  534. *
  535.    ELSE               ARG2 NOT NORMALIZED
  536.      BRA  GETW              RECALCULATE
  537. *
  538.    ENDIF
  539.  ENDIF
  540. *
  541. * CLEAR TEMP LOCATION OF P FROM THE STACK
  542. *
  543.  LEAS  ARGSIZ,S
  544. *
  545. * CONVERT W AND V TO BCD STRINGS I AND E RESPECTIVELY
  546. *
  547. * CONVERT W TO I
  548. *
  549. *
  550. * SET SIGN OF W TO THAT OF ORIGINAL ARGUMENT
  551. *
  552.  LDA  SGNAR,S              SIGN ORIGINAL ARGUMENT
  553.  STA  SIGNR,U
  554. *
  555.  LEAY  RESULT,U           W IN INTERNAL FORMAT
  556.  LDX  BCDADR,S              ADDRESS OF BCD ARRAY
  557.  LEAX  SF,X              POINT TO BCD FRACTION
  558.  LDB  #SIGDIG+1           LENGHT OF BCD FRACTION+1
  559. *
  560.  LBSR  BINSTR              BINARY TO STRING CONVERSION
  561. *
  562. * CONVERT V TO E
  563. *
  564. * KLUDGE UP V AS A FLOATING OPERAND
  565. *
  566. * ZERO OUT RESULT ON THE STACK FRAME
  567. *
  568.  LEAY  RESULT,U
  569.  CLRB
  570.  WHILE    B,LT,#ARGSIZ
  571.    CLR    B,Y
  572.    INCB
  573. *
  574.  ENDWH
  575. *
  576.  CLR  SIGN,Y             ASSUME SIGN POSITIVE
  577.  LDD  TV,S              GET V
  578.  IFCC  LT              V IS NEGATIVE
  579.    COMA
  580.    COMB
  581.    ADDD  #1
  582. *
  583.    COM    SIGN,Y             SET SIGN NEGATIVE
  584. *
  585.  ENDIF
  586. *
  587.  STD  FRACT,Y              INSERT INTO FRACTION OF ARG1
  588.  LDD  #EXPSIZ-1           INSET CORRECT EXPONENT
  589.  STD  EXP,Y
  590. *
  591.  LDX  BCDADR,S              ADDRESS OF BCD ARRAY
  592.  LDB  #EXPDIG+1           SIZE OF BCD EXP.+SIGN
  593. *
  594.  LBSR  BINSTR              BINARY TO STRING CONVERSION
  595. *
  596. * SET P ( NO. OF DIGITS TO THE RIGHT OF THE DECIMAL PT.)
  597. * TO ZERO.
  598. *
  599.  CLR  POFF,X         CLEAR P FIELD IN BCD STRING
  600. *
  601. EXOUTS    EQU  *         OUTS EXIT POINT .
  602. *
  603. *
  604.  LDA  TSTAT,U
  605.  ANDA  #$FF-ERRINX          CLEAR POSSIBLE INEXACT RESULT FLAG
  606.  STA  TSTAT,U
  607. *
  608. * REMOVE TEMPS FROM STACK
  609. *
  610.  LEAS  (TV+2),S
  611. *
  612.  RTS
  613. *
  614. *
  615. * PROCEDURE  CHEKW
  616. *
  617. *    CHEKW HANDLES ADJUSTING W FOR THE FOLLOWING
  618. * SPECIAL CASES WHEN DOING A BINARY TO DECIMAL
  619. * CONVERSION. THE SPECIAL CASES ARE:
  620. *
  621. *  1) IF W = 10|K , THEN INCREMENT V AND DIVIDE
  622. *     W BY 10( EXACTLY )
  623. *
  624. *  2) IF W >= (10|K)+1 , THEN INCREMENT V AND
  625. *     RECALCULATE W.
  626. *
  627. *  3) IF W <= (10|(K-1))-1 , THEN DECREMENT V
  628. *     AND RECALCULATE W.
  629. *
  630. * ON ENTRY: X - POINTS TO W ON THE STACK FRAME
  631. *        D - CONTAINS V
  632. *
  633. * ON EXIT: X - POINTS TO W ON THE STACK FRAME
  634. *       D - CONTAINS UPDATED VALUE OF V
  635. *
  636. *
  637. * LOCAL EQUATES FOR TEMPS ON S STACK
  638. *
  639. TK    EQU  0
  640. FUNC  EQU  TK+2
  641. REFLG  EQU  FUNC+1
  642. OKFLG  EQU  REFLG+1
  643. TMPW EQU OKFLG+1
  644. TVSPC EQU  TMPW+ARGSIZ          TEMPORARY V
  645. *
  646. CHEKW EQU  *
  647. *
  648.  PSHS  X,D              SAVE CALLERS REGS.
  649. *
  650. * SAVE W ON THE STACK
  651. *
  652.  LEAS  -ARGSIZ,S          CREATE SPACE
  653. *
  654.  LEAX  RESULT,U           SOURCE
  655.  LEAY  0,S              DESTINATION
  656.  LBSR  FPMOVE              MOVE W TO TEMP
  657. *
  658. * CREATE SPACE FOR TEMPS OM THE STACK
  659. *
  660.  LEAS  -(OKFLG+1),S
  661. *
  662. * INITIALIZE FLAGS; $00=TRUE, $FF=FALSE
  663. *
  664.  CLR  OKFLG,S              W IS OK FLAG  SET TRUE
  665.  LDA  #FALSE              W NEEDS RECALCULATING SET FALSE
  666.  STA  REFLG,S
  667. *
  668. * TEMPORARILY CHANGE FUNCTION CODE TO PREDICATE
  669. * COMPARE AND PRECISION TO EXTENDED.
  670. *
  671.  LDA  FUNCT,U              GET FUNCTION CODE
  672.  STA  FUNC,S              SAVE IT
  673.  LDA  #FCPCMP              REPLACE WITH
  674.  STA  FUNCT,U              PREDICATE COMPARE
  675. *
  676.  LDA  #EXT              EXTENDED RPREC INDEX
  677.  STA  RPREC,U
  678. *
  679. * SAVE K SINCE TPARAM NEEDED FOR COMPARE
  680. *
  681.  LDD TPARAM,U              GET K
  682.  STD  TK,S              SAVE IT
  683. *
  684. * CASE 1:  W = 10|K
  685. *
  686. * CALCULATE 10|K
  687. *
  688.  LBSR  PWRTEN
  689. *
  690. * MOVE 10|K TO ARG2
  691. *
  692.  LEAX  RESULT,U           SOURCE
  693.  LEAY  ARG2,U              DESTINATION
  694.  LBSR  FPMOVE
  695. *
  696. * MOVE W TO ARG1
  697. *
  698.  LEAX  TMPW,S              SOURCE
  699.  LEAY  ARG1,U              DESTINATION
  700.  LBSR  FPMOVE
  701. *
  702. * COMPARE W TO 10|K
  703. *
  704.  LDX  CASE1,PCR           SET UP PARAMETERS
  705.  STX  TPARAM,U
  706. *
  707.  LBSR  ARG1UN
  708. *
  709. * IF W = 10|K THEN DECREMENT K AND RECALCULATE
  710. * 10|K    AND INCREMENT V.
  711. *
  712.  LDA  FRACTR,U              RESULT OF THE COMPARE
  713.  IFCC  EQ              W = 10|K
  714.    LDD    TK,S              GET K
  715.    DECD               DECREMENT K
  716. *
  717.    LBSR  PWRTEN           RECALCULATE W
  718. *
  719.    LDD    TVSPC,S           INCREMENT V
  720.    INCD
  721.    STD    TVSPC,S
  722. *
  723.    LDA    #FALSE              SET OK FLAG FALSE
  724.    STA    OKFLG,S
  725. *
  726.    LBRA  EXITSP
  727. *
  728.  ENDIF
  729. *
  730. *
  731. * CASE 2:  W >= (10|K)+1
  732. *
  733. * ASSUME 10|K STILL IN ARG2
  734. *
  735. * PUT 1 IN ARG1
  736. *
  737.  LEAX  ONE,PCR              FLOATING ONE CONSTANT
  738.  LEAY  ARG1,U              DESTINATION
  739.  LBSR  FPMOVE
  740. *
  741.  LBSR  FADD              COMPUTE (10|K)+1
  742. *
  743. * MOVE (10|K)+1 T0 ARG2
  744. *
  745.  LEAX  RESULT,U           SOURCE
  746.  LEAY  ARG2,U              DESTINATION
  747.  LBSR  FPMOVE
  748. *
  749. * MOVE W TO ARG1
  750. *
  751.  LEAX  TMPW,S              SOURCE, TEMP W
  752.  LEAY  ARG1,U              DESTINATION
  753.  LBSR  FPMOVE
  754. *
  755. * COMPARE W TO (10|K)+1
  756. *
  757.  LDX  CASE2,PCR           SET UP PREDICATES
  758.  STX  TPARAM,U
  759. *
  760.  LBSR  ARG1UN
  761. *
  762. * IF W >= (10|K)+1 THEN INCREMENT V AND
  763. * RECALCULATE W.
  764. *
  765.  LDA  FRACTR,U              RESULT OF THE COMPARE
  766.  IFCC  EQ              W >= (10|K)+1
  767.    LDD    TVSPC,S           INCREMENT V
  768.    INCD
  769.    STD    TVSPC,S
  770. *
  771.    CLR    REFLG,S           SET RECALCULATE FLAG TRUE
  772.    LDA    #FALSE              SET OK FLAG FALSE
  773.    STA    OKFLG,S
  774. *
  775.    BRA    EXITSP
  776. *
  777.  ENDIF
  778. *
  779. * CASE 3:  W <= (10|(K-1))-1
  780. *
  781. * CALCULATE  (10|(K-1))-1
  782. *
  783.  LDD  TK,S              GET K
  784.  DECD                  DECEEMENT K
  785. *
  786.  LBSR  PWRTEN              CALCULATE 10|(K-1)
  787. *
  788. * MOVE 10|(K+1) TO ARG1
  789. *
  790.  LEAX  RESULT,U           SOURCE
  791.  LEAY  ARG1,U              DESTINATION
  792.  LBSR  FPMOVE
  793. *
  794. * MOVE ONE TO ARG2
  795. *
  796.  LEAX ONE,PCR              SOURCE
  797.  LEAY  ARG2,U              DESTINATION
  798.  LBSR  FPMOVE
  799. *
  800.  LBSR  FSUB              CALCULATE  (10|(K-1))-1
  801. *
  802. * MOVE    (10|(K-1))-1 TO ARG2
  803. *
  804.  LEAX  RESULT,U           SOURCE
  805.  LEAY  ARG2,U              DESTINATION
  806.  LBSR  FPMOVE
  807. *
  808. * MOVE W TO ARG1
  809. *
  810.  LEAX  TMPW,S              START OF TEMP W
  811.  LEAY ARG1,U              DESTINATION
  812.  LBSR  FPMOVE
  813. *
  814. * COMPARE W TO (10|(K-1))-1
  815. *
  816.  LDX  CASE3,PCR           SET UP PREDICATES
  817.  STX  TPARAM,U
  818. *
  819.  LBSR  ARG1UN
  820. *
  821. * IF W <= (10^(K-1))-1 AND ARG2 WAS ORIGINALLY
  822. * UNNORMALIZED THEN DECREMENT V AND RECALCULATE
  823. * W.
  824. *
  825.  LDA  FRACTR,U              RESULT OF COMPARE
  826.  IFCC  EQ              W <=  (10|(K-1))-1
  827.    LDA    TMPW+TYPE,S        NORM. INFO IN TYPE BYTE
  828.    IFCC  LT               W NORMALIZED
  829.      LDD  TVSPC,S        DECREMENT V
  830.      DECD
  831.      STD  TVSPC,S
  832. *
  833.      CLR  REFLG,S        SET RECALCULATE W FLAG TRUE
  834.      LDA  #FALSE        SET OK FLAG FALSE
  835.      STA  OKFLG,S
  836. *
  837.    ENDIF
  838.  ENDIF
  839. *
  840. *
  841. EXITSP EQU  *
  842. *
  843. * RESTORE FUNCTION CODE
  844. *
  845.  LDA  FUNC,S
  846.  STA  FUNCT,U
  847. *
  848.  LDD  TK,S
  849.  STD  TPARAM,U
  850. *
  851. * CHECK TO SEE IF ANY OF THE SPECIAL CASES WERE
  852. * MET; IF NOT THEN W IS OK AND SHOULD BE RETURNED
  853. * IN THE STACK FRAME RESULT.
  854. *
  855.  LDA  OKFLG,S              FLAG TRUE IF ALL TESTS FAIL
  856.  IFCC  EQ              W IS OK
  857.    LEAX  TMPW,S           SOURCE
  858.    LEAY  RESULT,U          DESTINATION
  859.    LBSR  FPMOVE           MOVE W TO THE RESULT
  860. *
  861.  ENDIF                  W IS OK
  862. *
  863. * SET CARRY APPROPRIATELY DEPENDING ON WHETHER
  864. * OR NOT RECALCULATION OF W  IS NECCESSARY.
  865. *
  866.  LDA  REFLG,S
  867.  COMA                  REMEMBER    TRUE = 00
  868.  RORA
  869. *
  870. * CLEAN UP STACK
  871. *
  872.  LEAS  ARGSIZ+OKFLG+1,S
  873. *
  874.  PULS  X,D,PC              RESTORE AND RETURN
  875. *
  876. * PREDICATE EQUATES
  877. *
  878. CASE1 FDB  $0422
  879. CASE2 FDB  $0C22
  880. CASE3 FDB  $0622
  881. *
  882. * SMALL LOG10(X) CONSTANTS
  883. *
  884. SSMLOG FCB  $80,00,$05,$98,$EC,$59
  885.        FCB  $4F,$F1,$D8,$57,$AA,00
  886.        FCB  TYNORM
  887. *
  888. DSMLOG FCB  $80,00,$08,$99,$FA,$12
  889.        FCB  $5E,$5A,$91,$03,$9B,00
  890.        FCB  TYNORM
  891. *
  892. *
  893. *
  894.  PAG
  895. *
  896. *
  897. ***********************************************************
  898. *
  899. *  PROCEDURE OUTNDC
  900. *
  901. *      HANDLES OUTPUTING OF NON-DECIMAL STRINGS
  902. * AND ZEROS . THE NON-DECIMAL STRINGS ARISE WHEN
  903. * A BINARY TO DECIMAL CONVERSION IS PERFORMED ON
  904. * A NAN OF A +/- INFINITY.
  905. *
  906. * ON ENTRY: ARG2 IS THE INPUT ARGUMENT
  907. *        TYPE BYTE IS SET CORRECTLY
  908. *        U - STACK FRAME POINTER
  909. *
  910. * ON EXIT: BCD STINGS FIST LOCATION CONTAINS
  911. *       SPECIAL CODE REPRSENTING +/-
  912. *       INFINITY OR A NAN
  913. *       IF A NAN THE NEXT 4 BYTES IN THE
  914. *       STRING CONTAIN THE NAN ADDRESS.
  915. *       U - UNCHANGED
  916. *       D,X,Y - DESTROYED
  917. *
  918. OUTNDC EQU  *
  919. *
  920. * ZERO OUT BCD STRING
  921. *
  922.   LDX  FRACTR,U         GET ADDRESS OF STRING
  923.   LDA  #STRSIZ
  924.   WHILE  A,GT,#0
  925.     DECA
  926.     CLR  A,X
  927. *
  928.   ENDWH
  929. *
  930. * DECIDE WHICH TO TAKE
  931. *
  932.   LDA  TYPE2,U            CHECK TYPE
  933.   IF  A,EQ,#TYINF        TYPE INFINITY
  934.     LDA  SIGN2,U        CHECK SIGN
  935.     IFCC  GE            SIGN POSITIVE
  936.       LDA  #PINF        SIGNAL POSITIVE INFINITY
  937.  
  938. *
  939.     ELSE
  940.       LDA  #NINF        SIGNAL MINUS INFINITY
  941. *
  942.     ENDIF
  943.     STA  0,X
  944. *
  945.   ELSE
  946.   IF  A,EQ,#TYNAN         TYPE NAN
  947.     LDA  #SNAN             SIGANL NAN
  948.     STA  0,X
  949. *
  950. * ALIGN NAN ADDRESS WITH BYTE BOUNDARY
  951. *
  952.     LEAY  FRACT2,U
  953.     LDB  #2
  954.     WHILE  B,GT,#0
  955.       LSHIFT  0,Y,3
  956.       DECB
  957. *
  958.     ENDWH
  959. *
  960. * INSERT NAN ADRESS INTO BCS STRING
  961. *
  962.     CLRB
  963.     WHILE  B,LT,#EXPDIG
  964.       INCB
  965.       LDA  0,Y               GET MSBYTE OF ADDRESS
  966.       LSRA
  967.       LSRA
  968.       LSRA
  969.       LSRA
  970.       STA  B,X                INSERT A HEX CHAR.
  971. *
  972.       INCB
  973.       LDA  0,Y
  974.       ANDA  #$0F
  975.       STA  B,X                INSERT A HEX CHAR.
  976. *
  977.       LEAY  1,Y             INCREMENT POINTER
  978. *
  979.     ENDWH
  980. *
  981.   ELSE
  982.   IF  A,EQ,#TYZERO             TYPE ZERO
  983.     LDA  SIGN2,U            CHECK SIGN
  984.     IFCC  GE                POSITIVE
  985.       LDA  #DPLUS
  986. *
  987.     ELSE                NEGATIVE
  988.       LDA  #DMINUS
  989. *
  990.     ENDIF
  991.     STA  SF,X                 INSERT CORRECT SIGN
  992. *
  993.   ENDIF
  994.   ENDIF
  995.   ENDIF
  996. *
  997.   RTS                   RETURN
  998.